package com.ecr.hub.service.impression.pdf.impl;

import java.io.IOException;
import java.net.MalformedURLException;
import java.text.DateFormat;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

import com.ecr.hub.ApplicationException;
import com.ecr.hub.model.composition.Composition;
import com.lowagie.text.BadElementException;
import com.lowagie.text.Document;
import com.lowagie.text.Image;
import com.lowagie.text.Rectangle;
import com.lowagie.text.pdf.PdfAction;
import com.lowagie.text.pdf.PdfDestination;
import com.lowagie.text.pdf.PdfWriter;

public abstract class AbstractPdfCreator {

	// Le format des dates.
	protected static final String FORMAT_DATE = "dd/MM/yyyy";
	// Le format des heures.
	protected static final String FORMAT_TIME = "HH:mm";
	// Le format des nombres.
	protected static final String FORMAT_DECIMAL = "#######0.00";

	protected String headerImgPath;
	//!! Attention au multiThread !!
	protected DateFormat simpleDateFormat;
	protected DateFormat simpleTimeFormat;
	protected DecimalFormat simpleDecimalFormat;
	protected String datePdf;
	protected String timePdf;

	AbstractPdfCreator() {
		Date date = new Date();
		simpleDateFormat = new SimpleDateFormat(FORMAT_DATE);
		datePdf = simpleDateFormat.format(date);
		simpleTimeFormat = new SimpleDateFormat(FORMAT_TIME);
		timePdf = simpleTimeFormat.format(date);
		simpleDecimalFormat = new DecimalFormat(FORMAT_DECIMAL);
	}

	/**
	 * Récupération de l'image à placer dans le document. On en profite pour
	 * formater directement l'image.
	 */
	protected Image getImage(String img_path) throws ApplicationException {
		Image img = null;
		try {
			img = Image.getInstance(img_path);
		} catch (BadElementException e) {
			throw new ApplicationException(e);
		} catch (MalformedURLException e) {
			throw new ApplicationException(e);
		} catch (IOException e) {
			throw new ApplicationException(e);
		}
		img.scaleToFit(100, 28);
		img.setBorder(Rectangle.NO_BORDER);
		return img;
	}

	/**
	 * Renvoi le nombre de pages à afficher par rapport à la liste des données.
	 * Das le cas ou il y a des lots, il faut aussi prendre en compte la ligne
	 * nécessaire pour écrire le numéro de lot (compte comme un wagon).
	 */
	protected int getNbpages(List<? extends Object> l, int nbLinesByPage,
			boolean lots) {

		int offset = 0;

		if (lots) {
			// On sait que ce sont obligatoirement des compositions.
			Composition composition = (Composition) l.get(l.size() - 1);
			offset = composition.getWagon().getNumLot();
		}

		int nbpages = (l.size() + offset) / nbLinesByPage;

		if ((l.size() + offset) % nbLinesByPage > 0) {
			nbpages++;
		}

		if (nbpages == 0) {
			nbpages = 1;
		}
		return nbpages;
	}

	/**
	 * Ajout des données META dans le document (fichier / propriétés).
	 */
	protected void addMetaData(Document document, String title, String subject) {

		document.addTitle("Centre de tri de Gevrey : " + title);
		// document.addAuthor("user");
		document.addCreator("Document automatique");
		document.addSubject(subject);
		document.addCreationDate();
		// document.addKeywords("Sillon, PDF ");
	}

	/**
	 * Positionne le facteur de zoom par défaut pour l'affichage du document
	 * dans le viewer du navigateur.
	 */
	protected void setDefaultZoom(PdfWriter pdfWriter, int defaultZoom) {

		PdfAction action = PdfAction.gotoLocalPage(1, new PdfDestination(
				PdfDestination.XYZ, 0, defaultZoom, 1), pdfWriter);

		pdfWriter.setOpenAction(action);
	}
}
